package com.riwon.im.common.result;

import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 解决 ResultData 中 status 日益庞大的问题
 * <p>
 * 响应码,分两大类,
 * <ul>
 * <li>展示类</li>
 * <li>逻辑控制类</li>
 * </ul>
 * <p>
 * 所有端通用的响应码,建议经商量后,统一维护在 common 包下,可基本商品,订单,客户,员工 等所有端都包含,放在 common 下
 * 标识规范,共五位,<br/>
 * 第1,2,3位,表示模块从3开始, 300表示通用模块 ,301（每个模块可新建一个枚举）<br/>
 * 第4,5,位,表示 具体响应码值 00~99<br/>
 *
 * @author K.F
 * @since 1.9.2
 * 2017/11/27
 */
public interface ResponseStatus {

  final static Map<Integer, ResponseStatus> statusMap = new HashMap<>();

  /**
   * 响应码
   *
   * @return
   */
  Integer status();

  /**
   * 响应描述,短的文字描述
   *
   * @return
   */
  String statusMsg();

  /**
   * 响应英文标识码
   *
   * @return
   */
  String statusDes();

  /**
   * 全局注册状态对象
   *
   * @param status
   */
  static void registStatus(ResponseStatus... status) {
    long count = Stream.of(status).filter(s -> statusMap.get(s.status()) != null).count();
    if (count > 0) {
      throw new IllegalStateException("状态有重复,程序被停止启动");
    }
    statusMap.putAll(Stream.of(status).collect(Collectors.toMap(t -> t.status(), Function.identity())));
  }

  static ResponseStatus getStatusByCode(int code) {
    ResponseStatus status = statusMap.get(code);
    if (status == null) {
      throw new IllegalArgumentException("不存存文档所定义的状态值");
    }
    return status;
  }
}
